package com.cskaoyan.javase.oop3._3local._2usecase;

/**
 * 局部内部类定义在局部位置
 * 当你在局部位置需要创建一个对象,解决需求
 * 并且这个对象需要继承,实现某个类,接口,然后重写方法
 * 常规的做法是: 新建一个独立的class然后继承,实现
 * 学完局部内部类后,我们可以在局部位置新建一个局部内部类,然后继承实现,并得到一个对象
 *
 * 常见的场景是:
 *      1.作为方法的实参传入方法
 *      2.作为方法的返回值返回
 *
 * 局部内部类使用的:
 * 优点:
 *      1.绝对封装,绝对隐藏,对外界不可见
 *      2.稍微简便一点,节省一点时间
 * 缺点:
 *      是一个一次性的类,在方法中使用完毕,在其他地方不可用
 *
 * 综上,当你在局部位置,就一次性的使用某个类时,为了隐藏,为了更简便,可以考虑使用局部内部类.
 * 但是如果需要在多个位置多次使用某个类,局部内部类就不要用了.
 *
 *
 * @since 14:35
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo {
    public static void main(String[] args) {
        test(new A());
        test(new ASon());

        // 定义局部内部类
        class ASon extends A {
            @Override
            void test() {
                System.out.println("我是局部内部类ASon的实现!");
            }
        }
        test(new ASon());
        System.out.println("-----------------");
        IA ia = test();
        ia.method();

    }

    public static void test(A a) {
        a.test();
    }

    public static IA test() {
        // 定义局部内部类来写接口的实现类
        class IAImpl implements IA {
            @Override
            public void method() {
                System.out.println("我喜欢你!");
            }
        }
        return new IAImpl();
    }
}

class A {
    void test() {
        System.out.println("A");
    }
}

class ASon extends A {
    @Override
    void test() {
        System.out.println("我是A的儿子!");
    }
}

interface IA {
    void method();
}